/**
 * 文 件 名:  OSSRequestBody.java
 * 版    权:  Technologies Co., Ltd. Copyright YYYY-YYYY,  All rights reserved
 * 描    述:  <描述>
 * 修 改 人:  baoyinbo 00501
 * 修改时间:  16/6/29
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */

package com.shuaiche.yeguan.net.oss;

import android.net.Uri;
import android.text.TextUtils;

import com.alibaba.sdk.android.oss.common.utils.BinaryUtil;
import com.alibaba.sdk.android.oss.model.ObjectMetadata;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.shuaiche.yeguan.util.BitmapUtil;

import java.io.IOException;

import androidx.annotation.NonNull;

/**
 * 请求参数
 *
 */
public class OSSRequestBody {
    private final String mBucketName;

    /***
     * OSS服务是没有文件夹这个概念的，所有元素都是以文件来存储，但给用户提供了创建模拟文件夹的方式。
     * 创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件，对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示。
     * 如，在上传文件是，如果把ObjectKey写为"folder/subfolder/file"，即是模拟了把文件上传到folder/subfolder/下的file文件。
     * 注意，路径默认是"根目录"，不需要以'/'开头
     *
     */
    private final String mObjectKey;
    /**
     * 要上传的文件路径
     */
    private final String mUploadFilePath;
    private final Uri mUploadFileUri;
    /**
     * 是否校验MD5
     */
    private final String mContentType;
    /**
     * 是否校验MD5
     */
    private final boolean isCheckMD5;

    private boolean isUploadByUri;

    private OSSRequestBody(@NonNull Builder builder) {
        this.mBucketName = builder.bucketName;
        this.mObjectKey = builder.objectKey;
        this.mUploadFilePath = builder.uploadFilePath;
        this.mUploadFileUri = builder.uploadFileUri;
        this.mContentType = builder.contentType;
        this.isCheckMD5 = builder.isCheckMD5;
    }

    /**
     * 获取request
     *
     * @return
     */
    public PutObjectRequest getRequest() {
        /**构造上传请求*/
        PutObjectRequest put = new PutObjectRequest(this.mBucketName, this.mObjectKey, this.mUploadFilePath);
        //文件元信息的设置是可选的
        if (!TextUtils.isEmpty(mContentType) || this.isCheckMD5) {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setCacheControl("max-age=31104000");
            if (!TextUtils.isEmpty(mContentType)) {
                metadata.setContentType(this.mContentType); // 设置content-type
            }

            if (this.isCheckMD5) {
                try {
                    metadata.setContentMD5(BinaryUtil.calculateBase64Md5(this.mUploadFilePath)); // 校验MD5
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            put.setMetadata(metadata);
        }
        return put;
    }

    public PutObjectRequest getRequestByUri() {
        /**构造上传请求*/
        PutObjectRequest put = new PutObjectRequest(this.mBucketName, this.mObjectKey, this.mUploadFileUri);
        //文件元信息的设置是可选的
        if (!TextUtils.isEmpty(mContentType) || this.isCheckMD5) {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setCacheControl("max-age=31104000");
            if (!TextUtils.isEmpty(mContentType)) {
                metadata.setContentType(this.mContentType); // 设置content-type
            }

//            if (this.isCheckMD5) {
//                try {
//                    metadata.setContentMD5(BinaryUtil.calculateBase64Md5(this.mUploadFilePath)); // 校验MD5
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
            put.setMetadata(metadata);
        }
        return put;
    }

    public PutObjectRequest getBitmapRequest() {
        /**构造上传请求*/
        byte[] data = BitmapUtil.processImage(this.mUploadFilePath,1920);
        PutObjectRequest put = new PutObjectRequest(this.mBucketName, this.mObjectKey, data);
        //文件元信息的设置是可选的
        if (!TextUtils.isEmpty(mContentType) || this.isCheckMD5) {
            ObjectMetadata metadata = new ObjectMetadata();
            if (!TextUtils.isEmpty(mContentType)) {
                metadata.setContentType(this.mContentType); // 设置content-type
            }
            if (this.isCheckMD5) {
                try {
                    metadata.setContentMD5(BinaryUtil.calculateBase64Md5(this.mUploadFilePath)); // 校验MD5
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            put.setMetadata(metadata);
        }
        return put;
    }



    public static class Builder {
        private String bucketName;
        /**
         * 上传文件key
         */
        private String objectKey;
        /**
         * 要上传的文件路径
         */
        private String uploadFilePath;
        private Uri uploadFileUri;
        /**
         * contentType
         */
        private String contentType;
        /**
         * 是否校验MD5
         */
        private boolean isCheckMD5;

        public Builder(@NonNull String bucketName, @NonNull String objectKey, @NonNull String uploadFilePath) {
            this.bucketName = bucketName;
            this.objectKey = objectKey;
            this.uploadFilePath = uploadFilePath;
        }

        public Builder(@NonNull String bucketName, @NonNull String objectKey, @NonNull Uri uri) {
            this.bucketName = bucketName;
            this.objectKey = objectKey;
            this.uploadFileUri = uri;
        }

        /**
         * 设置内容类型
         *
         * @param contentType
         * @return
         */
        public Builder contentType(String contentType) {
            this.contentType = contentType;
            return this;
        }

        /**
         * 设置是否校验MD5
         *
         * @param isCheckMD5
         * @return
         */
        public Builder isCheckMD5(boolean isCheckMD5) {
            this.isCheckMD5 = isCheckMD5;
            return this;
        }

        /**
         * 构建OSSRequestBody
         *
         * @return
         */
        public OSSRequestBody build() {
            return new OSSRequestBody(this);
        }
    }
}
